home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / graphics / pstricks / inputs / fancybox.sty (.txt) < prev    next >
LaTeX Document  |  1993-04-07  |  26KB  |  794 lines

  1. %% BEGIN fancybox.sty
  2. \def\fileversion{1.0}
  3. \def\filedate{93/02/10}
  4. %% COPYRIGHT 1993, by Timothy Van Zandt, tvz@Princeton.EDU
  5. %% DESCRIPTION:
  6. %%   fancybox.sty is a LaTeX style option, consisting of:
  7. %%   * Variants of \fbox: \shadowbox, \doublebox, \ovalbox, \Ovalbox.
  8. %%   * Helpful tools for using box macros.
  9. %%   * Extensive documentation about how to use box macros.
  10. %%   * Flexible verbatim macros.
  11. %% INSTALLATION:
  12. %%   Put this file where your TeX looks for inputs.
  13. %% DOCUMENTATION:
  14. %%  See fancybox.doc, which might be appended to this file.
  15. %% COPYING:
  16. %%   Copying of part or all of this file is allowed under the following
  17. %%   conditions only:
  18. %%   (1) You may freely distribute unchanged copies of the file. Please
  19. %%       include the documentation when you do so.
  20. %%   (2) You may modify a renamed copy of the file, but only for personal
  21. %%       use or use within an organization.
  22. %%   (3) You may copy fragments from the file, for personal use or for
  23. %%       distribution, as long as credit is given where credit is due.
  24. %%   You are NOT ALLOWED to take money for the distribution or use of
  25. %%   this file or modified versions or fragments thereof, except for
  26. %%   a nominal charge for copying etc.
  27. %% CODE:
  28. \expandafter\ifx\csname fb@framepage\endcsname\relax\else
  29.   \expandafter\endinput
  30. \typeout{Style option: `fancybox' v\fileversion \space  <\filedate> (tvz)}
  31. \newbox\@fancybox
  32. \@ifundefined{@tempdimc}{\newdimen\@tempdimc}{}
  33. %% \shadowbox
  34. \newdimen\shadowsize
  35. \shadowsize 4pt
  36. \def\shadowbox{\VerbBox\@shadowbox}
  37. \def\@shadowbox#1{%
  38.   \setbox\@fancybox\hbox{\fbox{#1}}%
  39.   \leavevmode\vbox{%
  40.     \offinterlineskip
  41.     \dimen@=\shadowsize
  42.     \advance\dimen@ .5\fboxrule
  43.     \hbox{\copy\@fancybox\kern-.5\fboxrule\lower\shadowsize\hbox{%
  44.       \vrule \@height\ht\@fancybox \@depth\dp\@fancybox \@width\dimen@}}%
  45.     \vskip-\dimen@
  46.     \moveright\shadowsize\vbox{%
  47.       \hrule \@width\wd\@fancybox \@height\dimen@}}}
  48. % \fancyoval
  49. \def\cornersize{\@ifstar{\@cornersize}{\@@cornersize}}
  50. \def\@cornersize#1{%
  51.   \@tempdima=#1\relax
  52.   \edef\the@cornersize{\number\@tempdima sp}}
  53. \def\@@cornersize#1{%
  54.   \edef\the@cornersize{#1\noexpand\@tempdimb}}
  55. \cornersize{.5}
  56. % This is just a simple change to \oval, making use of the \cornersize
  57. % parameter instead of making the corner arcs are large as possible.
  58. \def\fancyoval(#1,#2){\@ifnextchar[{\fancy@oval(#1,#2)}{\fancy@oval(#1,#2)[]}}
  59. \def\fancy@oval(#1,#2)[#3]{%
  60.   \begingroup
  61.     \fancy@@oval{#1\unitlength}{#2\unitlength}{#3}%
  62.     \@put{-.5\wd\@tempboxa}{-.5\ht\@tempboxa}{\ht\@tempboxa=\z@\box\@tempboxa}%
  63.   \endgroup}
  64. \def\fancy@@oval#1#2#3{%
  65.   \boxmaxdepth \maxdimen
  66.   \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
  67.   \@tfor\@tempa :=#3\do{\csname @ov\@tempa false\endcsname}%
  68.   \@ovxx#1\relax
  69.   \advance\@ovxx-\@wholewidth
  70.   \@ovyy#2\relax
  71.   \advance\@ovyy-\@wholewidth
  72.   \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
  73.   \advance\@tempdimb-2\p@
  74.   \ifdim\@tempdimb>\the@cornersize\relax
  75.     \@tempdimb=\the@cornersize
  76.   \fi
  77.   \@getcirc\@tempdimb
  78.   \@ovro\ht\@tempboxa \@ovri\dp\@tempboxa
  79.   \@ovdx\@ovxx \advance\@ovdx-\@tempdima \divide\@ovdx \tw@
  80.   \@ovdy\@ovyy \advance\@ovdy-\@tempdima \divide\@ovdy \tw@
  81.   \@circlefnt
  82.   \setbox\@tempboxa\hbox{%
  83.     \if@ovr \@ovvert32\kern -\@tempdima \fi
  84.     \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi
  85.     \if@ovt \@ovhorz \kern -\@ovxx \fi
  86.     \if@ovb \raise \@ovyy \@ovhorz \fi}%
  87.   \advance\@ovdx\@ovro
  88.   \advance\@ovdy\@ovro
  89.   \advance\@ovxx\@wholewidth
  90.   \wd\@tempboxa=\@ovxx
  91.   \dp\@tempboxa=\z@}
  92. % \ovalbox
  93. \def\ovalbox{\VerbBox{\@ovalbox\thinlines}}
  94. \def\Ovalbox{\VerbBox{\@ovalbox\thicklines}}
  95. \def\@ovalbox#1#2{%
  96.   \begingroup
  97.     #1\relax
  98.     \setbox\@fancybox\hbox{{#2}}%
  99.     \@tempdimc\fboxsep \advance\@tempdimc\@wholewidth
  100.     \@tempdima\ht\@fancybox \advance\@tempdima\dp\@fancybox
  101.     \advance\@tempdima2\@tempdimc
  102.     \@tempdimb\wd\@fancybox \advance\@tempdimb2\@tempdimc
  103.     \fancy@@oval\@tempdimb\@tempdima{}%
  104.     \@tempdima\dp\@fancybox \advance\@tempdima\@tempdimc
  105.     \wd\@tempboxa=\z@
  106.     \leavevmode\hbox{%
  107.       \lower\@tempdima\box\@tempboxa
  108.       \kern\@tempdimc\box\@fancybox\kern\@tempdimc}%
  109.   \endgroup}
  110. % \doublebox
  111. \def\doublebox{\VerbBox\@doublebox}
  112. \def\@doublebox#1{%
  113.   \begingroup
  114.     \setbox\@fancybox\hbox{{#1}}%
  115.     \fboxrule=.75\fboxrule
  116.     \setbox\@fancybox\hbox{\fbox{\box\@fancybox}}%
  117.     \fboxrule=2\fboxrule
  118.     \fboxsep=\fboxrule
  119.     \advance\fboxsep .5pt
  120.     \fbox{\box\@fancybox}%
  121.   \endgroup}
  122. % Frames for seminar.sty:
  123. \@ifundefined{newslideframe}{}{%
  124.   \newslideframe{shadow}{\shadowbox{#1}}
  125.   \newslideframe{double}{\doublebox{#1}}
  126.   \newslideframe{oval}{\ovalbox{#1}}
  127.   \newslideframe{Oval}{\Ovalbox{#1}}}
  128. % Sbox environment
  129. \newbox\@Sbox
  130. \def\Sbox{\global\setbox\@Sbox\hbox\bgroup\ignorespaces}
  131. \def\endSbox{%
  132.   \@testtrue\ifhmode\ifinner\@testfalse\fi\fi
  133.   \if@test\@latexerr{Misplaced \string\endSbox! Should be in LR mode}\@ehd\fi
  134.   \egroup}
  135. \def\TheSbox{%
  136.   \ifvoid\@Sbox
  137.     \@latexerr{\string\TheSbox\space is empty!}\@ehd
  138.   \else
  139.     \box\@Sbox
  140.   \fi}
  141. \def\beginsbox#1{\setbox#1\hbox\bgroup\ignorespaces}
  142. \def\endsbox{\endSbox}
  143. % \VerbBox
  144. \newtoks\do@VerbBox
  145. \def\VerbBox#1{%
  146.   \do@VerbBox{#1}%
  147.   \afterassignment\begin@VerbBox
  148.   \setbox\@fancybox=\hbox}
  149. \def\begin@VerbBox{\aftergroup\end@VerbBox}
  150. \def\end@VerbBox{\the\do@VerbBox{\box\@fancybox}}%
  151. % \Btrivlist
  152. \def\@Blistrestore{%
  153.   \let\par\relax
  154.   \let\-\@dischyph \let\'\@acci \let\`\@accii \let\=\@acciii
  155.   \lineskip\normallineskip \baselineskip\normalbaselineskip}
  156. \def\Btrivlist#1{\@ifnextchar[{\@Btrivlist{#1}}{\@Btrivlist{#1}[]}}
  157. \def\@Btrivlist#1[#2]{%
  158.   \@Blistrestore
  159.   \let\\=\@Btrivlistcr
  160.   \fb@beginvbox{#2}%
  161.   \halign\bgroup
  162.     \if#1l\else\@empty\hfil\fi
  163.     \ignorespaces##\unskip
  164.     \if#1r\@empty\else\hfil\fi\cr}
  165. \def\endBtrivlist{\crcr\egroup\egroup\if@pboxsw$\fi}
  166. \def\fb@beginvbox#1{%
  167.   \leavevmode
  168.   \@pboxswfalse
  169.   \if#1b\@empty\vbox\else\if#1t\@empty\vtop\else
  170.     \ifmmode\vcenter\else\@pboxswtrue$\vcenter\fi
  171.   \fi\fi\bgroup}
  172. \def\@Btrivlistcr{\@ifstar
  173.   {\@ifnextchar[{@@Btrivlistcr}{\cr}}{\@ifnextchar[{\@@Btrivlistcr}{\cr}}}
  174. \def\@@Btrivlistcr[#1]{\cr\noalign{\vskip #1}}
  175. \def\Bcenter{\Btrivlist{c}}
  176. \def\endBcenter{\endBtrivlist}
  177. \def\Bflushleft{\Btrivlist{l}}
  178. \def\endBflushleft{\endBtrivlist}
  179. \def\Bflushright{\Btrivlist{r}}
  180. \def\endBflushright{\endBtrivlist}
  181. % \Blist
  182. \def\Blist#1#2{\@ifnextchar[{\@Blist{#1}{#2}}{\@Blist{#1}{#2}[]}}
  183. \def\@Blist#1#2[#3]{%
  184.   \ifnum\@listdepth>5
  185.     \@toodeep
  186.   \else
  187.     \global\advance\@listdepth\@ne
  188.   \fi
  189.   \itemindent\z@
  190.   \csname @list\romannumeral\the\@listdepth\endcsname
  191.   \def\@itemlabel{#1}%
  192.   \let\makelabel\@mklab
  193.   \@nmbrlistfalse
  194.   \@Blistrestore
  195.   \let\\=\@Blistcr
  196.   \let\item\Bitem
  197.   \@Bitemswfalse
  198.   #2\relax
  199.   \fb@beginvbox{#3}%
  200.   \halign\bgroup
  201.     \ignorespaces##&\hskip\labelsep\ignorespaces##\unskip\hfil\cr}
  202. \def\endBlist{\endBtrivlist\global\advance\@listdepth\m@ne}
  203. \newif\if@Bitemsw
  204. \def\Bitem{\@ifnextchar({\@Bitemcr\Bitem@skip}{\@Bitemcr\@Bitem}}
  205. \def\@Bitemcr{%
  206.   \if@Bitemsw
  207.     \def\next{\cr\noalign{\vskip\itemsep}}%
  208.   \else
  209.     \def\next{\global\@Bitemswtrue}%
  210.   \fi
  211.   \next}
  212. \def\Bitem@skip(#1){\noalign{\vskip #1}\@Bitem}
  213. \def\@Bitem{\@ifnextchar[{\Bitem@label}{\Bitem@nolabel}}
  214. \def\Bitem@label[#1]{\makelabel{#1}&}
  215. \def\Bitem@nolabel{%
  216.   \if@nmbrlist
  217.     \expandafter\advance\csname c@\@listctr\endcsname1 \fi
  218.   \makelabel{\@itemlabel}%
  219.   \if@nmbrlist\refstepcounter{\@listctr}\fi}
  220. \def\@Blistcr{\@ifstar
  221.   {\@ifnextchar[{@@Blistcr}{\cr&}}{\@ifnextchar[{\@@Blistcr}{\cr&}}}
  222. \def\@@Blistcr[#1]{\cr\noalign{\vskip #1}&}
  223. % \Bitemize
  224. \def\Bitemize{%
  225.   \ifnum\@itemdepth>3
  226.     \@toodeep
  227.   \else
  228.     \advance\@itemdepth\@ne
  229.   \fi
  230.   \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
  231.   \Blist{\csname\@itemitem\endcsname}{\def\makelabel####1{\hfil####1}}}
  232. \def\endBitemize{\endBlist}
  233. % \Bdescription
  234. \def\Bdescription{\Blist{}{\def\makelabel####1{\bf####1\hfil}}}
  235. \def\endBdescription{\endBlist}
  236. % \Benumerate
  237. \def\Benumerate{%
  238.   \ifnum\@enumdepth>3
  239.     \@toodeep
  240.   \else
  241.     \advance\@enumdepth\@ne
  242.   \fi
  243.   \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
  244.   \Blist{\csname label\@enumctr\endcsname}%
  245.     {\usecounter{\@enumctr}\def\makelabel####1{\hfil####1}}}
  246. \def\endBenumerate{\endBlist}
  247. % Beqnarray
  248. \def\Beqnarray{%
  249.   \stepcounter{equation}%
  250.   \let\@currentlabel\theequation
  251.   \def\@eqnnum{{\csname reset@font\endcsname\rm (\theequation)}}%
  252.   \global\@eqnswtrue\m@th
  253.   \global\@eqcnt\z@
  254.   \tabskip\@centering
  255.   \let\\\@eqncr
  256.   \vbox\bgroup
  257.     \halign\bgroup
  258.       \@eqnsel
  259.         \hskip\@centering
  260.         $\displaystyle\tabskip\z@{##}$%
  261.       &\global\@eqcnt\@ne
  262.         \hskip 2\arraycolsep
  263.         \hfil${##}$\hfil
  264.       &\global\@eqcnt\tw@
  265.         \hskip 2\arraycolsep
  266.         $\displaystyle\tabskip\z@{##}$%
  267.         \hfil
  268.         \tabskip\@centering
  269.       &\if@eqnsw\hskip 1em\fi
  270.         \hfil{##}\tabskip\z@
  271.       \cr}
  272. \def\endBeqnarray{%
  273.   \@@eqncr
  274.   \egroup
  275.   \global\advance\c@equation\m@ne
  276.   \egroup
  277.   \global\@ignoretrue}
  278. \@namedef{Beqnarray*}{\def\@eqncr{\nonumber\@seqncr}\Beqnarray}
  279. \@namedef{endBeqnarray*}{\nonumber\endBeqnarray}
  280. % \fb@outputage
  281. % Here we insert various hooks for rotating or framing the page.
  282. % Otherwise, it is the usual \@outputpage
  283. \def\fb@outputpage{%
  284.   \begingroup
  285.     \catcode`\ =10
  286.     \let\-\@dischyph
  287.     \let\'\@acci
  288.     \let\`\@accii
  289.     \let\=\@acciii
  290.     \if@specialpage
  291.       \global\@specialpagefalse\@nameuse{ps@\@specialstyle}%
  292.     \fi
  293.     \if@twoside
  294.       \ifodd\count\z@
  295.         \let\@thehead\@oddhead
  296.         \let\@thefoot\@oddfoot
  297.         \let\@themargin\oddsidemargin
  298.       \else
  299.         \let\@thehead\@evenhead
  300.         \let\@thefoot\@evenfoot
  301.         \let\@themargin\evensidemargin
  302.       \fi
  303.     \fi
  304.     \csname reset@font\endcsname
  305.     \normalsize
  306.     \baselineskip\z@
  307.     \lineskip\z@
  308.     \let\par\@@par
  309.     \ifx\this@fancypage\@empty\else
  310.       \this@fancypage
  311.       \gdef\this@fancypage{}%
  312.     \fi
  313.     \ifx\the@fancypage\@empty\else
  314.       \setbox\@outputbox\hbox{\the@fancypage{\box\@outputbox}}%
  315.     \fi
  316.     \ifx\fb@@rotatepage\@empty\else
  317.       \setbox\@outputbox\hbox{\fb@@rotatepage{\box\@outputbox}}%
  318.     \fi
  319.     \setbox\@outputbox\vbox{%
  320.       \@tempdima=\wd\@outputbox
  321.       \setbox\@tempboxa=\hbox to\@tempdima{%
  322.         \let\label\@gobble
  323.         \let\index\@gobble
  324.         \let\glossary\@gobble
  325.         \@thehead}%
  326.       \ht\@tempboxa\headheight
  327.       \dp\@tempboxa\z@
  328.       \box\@tempboxa
  329.       \vskip\headsep
  330.       \box\@outputbox
  331.       \baselineskip\footskip
  332.       \hbox to\@tempdima{%
  333.         \let\label\@gobble
  334.         \let\index\@gobble
  335.         \let\glossary\@gobble
  336.         \@thefoot}}
  337.     \ifx\the@@fancypage\@empty\else
  338.       \setbox\@outputbox\hbox{\the@@fancypage{\box\@outputbox}}%
  339.     \fi
  340.     \setbox\@outputbox\vbox{%
  341.       \ifnum\fancyput@flag>-1 \do@fancyput\fi
  342.       \vskip\topmargin
  343.       \moveright\@themargin\box\@outputbox}%
  344.     \ifx\fb@rotatepage\@empty\else
  345.        \setbox\@outputbox\hbox{\lower\ht\@outputbox\box\@outputbox}%
  346.        \dp\@outputbox\z@
  347.        \wd\@outputbox\z@
  348.        \setbox\@outputbox\hbox{\fb@rotatepage{\box\@outputbox}}%
  349.        \expandafter\fb@setoffsets\fb@theoffsets
  350.     \fi
  351.     \shipout\box\@outputbox
  352.     \global\@colht\textheight
  353.   \endgroup
  354.   \stepcounter{page}%
  355.   \let\firstmark\botmark}
  356. % \fancypage
  357. \def\the@fancypage{}
  358. \def\the@@fancypage{}
  359. \def\this@fancypage{}
  360. \def\fancypage#1#2{%
  361.   \def\the@fancypage{#1}%
  362.   \def\the@@fancypage{#2}%
  363.   \def\@outputpage{\fb@outputpage}}
  364. \def\thisfancypage#1#2{%
  365.   \gdef\@outputpage{\fb@outputpage}%
  366.   \gdef\this@fancypage{\def\the@fancypage{#1}\def\the@@fancypage{#2}}}
  367. % \fancyput
  368. % Token registers used to make it easier to put definitions in argument.
  369. % Boxes not processed until output so that contents can depend, e.g., on
  370. % current page or marks or whatever. This makes everything slightly more
  371. % complicated than one would expect.
  372. \newtoks\the@fancyput
  373. \newtoks\this@fancyput
  374. \def\fancyput@flag{-1}%
  375. % \fancyput@flag=-1 if no fancyput, 0 if regular fancyput, 1 if thisfancyput.
  376. \def\fancyput{%
  377.   \def\@outputpage{\fb@outputpage}
  378.   \@ifstar{\@testtrue\@fancyput}{\@testfalse\@fancyput}}
  379. \def\@fancyput{\@ifnextchar({\@@fancyput}{\@@fancyput(\z@,\z@)}}
  380. \def\@@fancyput(#1,#2)#3{%
  381.   \if@test
  382.     \expandafter\the@fancyput\expandafter{\the\the@fancyput\do{#1}{#2}{#3}}%
  383.   \else
  384.     \the@fancyput{\do{#1}{#2}{#3}}%
  385.   \fi
  386.   \gdef\fancyput@flag{\z@}}
  387. \def\thisfancyput{%
  388.   \gdef\@outputpage{\fb@outputpage}
  389.   \@ifstar{\@testtrue\@thisfancyput}{\@testfalse\@thisfancyput}}
  390. \def\@thisfancyput{\@ifnextchar({\@@thisfancyput}{\@@thisfancyput(\z@,\z@)}}
  391. \def\@@thisfancyput(#1,#2)#3{%
  392.   \if@test
  393.     \ifnum\fancyput@flag=\z@
  394.       \expandafter\global\expandafter\this@fancyput\expandafter{%
  395.         \the\this@fancyput\do{#1}{#2}{#3}}%
  396.     \else
  397.       \expandafter\global\expandafter\this@fancyput\expandafter{%
  398.         \the\the@fancyput\do{#1}{#2}{#3}}%
  399.     \fi
  400.   \else
  401.     \global\this@fancyput{\do{#1}{#2}{#3}}%
  402.   \fi
  403.   \gdef\fancyput@flag{1}}
  404. \def\do@fancyput{%
  405.   \def\do##1##2##3{\raise##2\hbox to\z@{\kern##1\relax##3\hss}}%
  406.   \setbox\@tempboxa=\hbox to\z@{%
  407.     \kern-\hoffset
  408.     \raise\voffset\hbox{%
  409.       \ifnum\fancyput@flag=\z@\the\the@fancyput\else\the\this@fancyput\fi}%
  410.     \hss}%
  411.   \ht\@tempboxa=\z@ \dp\@tempboxa=\z@
  412.   \box\@tempboxa
  413.   \gdef\fancyput@flag{\z@}%
  414.   \global\this@fancyput{}}
  415. % \Landscape
  416. \def\UsePageParameters{%
  417.   \clearpage
  418.   \global\@colht\textheight
  419.   \onecolumn}
  420. \def\fb@rotatepage{}
  421. \def\Landscape{\@ifstar{\@testtrue\@Landscape}{\@testfalse\@Landscape}}
  422. \def\@Landscape#1#2#3{%
  423.   \clearpage
  424.   \def\fb@rotatepage{#3}%
  425.   \def\@outputpage{\fb@outputpage}%
  426.   \@tempdima#1\relax
  427.   \@tempdimb#2\relax
  428.   \if@test
  429.     \edef\fb@theoffsets{{\voffset}{\hoffset}{\number\@tempdima sp}}%
  430.   \else
  431.     \edef\fb@theoffsets{{\hoffset}{\voffset}{\number\@tempdimb sp}}%
  432.   \fi
  433.   \advance\@tempdimb-\@tempdima
  434.   \advance\textwidth\@tempdimb
  435.   \advance\textheight-\@tempdimb
  436.   \UsePageParameters}
  437. \def\endLandscape{\clearpage\aftergroup\UsePageParameters}
  438. \def\fb@setoffsets#1#2#3{%
  439.   \@tempdima#1%
  440.   \advance#1#2%
  441.   #2#3
  442.   \advance#2-2in
  443.   \advance#2-\@tempdima}
  444. \@namedef{Landscape*}{\@testtrue\@Landscape}
  445. \@namedef{endLandscape*}{\endLandscape}
  446. % \LandScape
  447. \def\fb@@rotatepage{}
  448. \def\LandScape#1{%
  449.   \clearpage
  450.   \def\fb@@rotatepage{#1}%
  451.   \def\@outputpage{\fb@outputpage}%
  452.   \@tempdima\textheight
  453.   \textheight\textwidth
  454.   \textwidth\@tempdima
  455.   \UsePageParameters}
  456. \def\endLandScape{\clearpage\aftergroup\UsePageParameters}
  457. % \GenericCaption
  458. \def\GenericCaption#1{%
  459.   \par
  460.   \begingroup
  461.     \@parboxrestore
  462.     \normalsize
  463.     \vskip 10\p@
  464.     \setbox\@tempboxa\hbox{#1}%
  465.     \ifdim\wd\@tempboxa>\hsize
  466.       #1\par
  467.     \else
  468.       \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
  469.     \fi
  470.   \endgroup
  471.   \par}
  472. % \landfloat
  473. \def\landfloat#1#2{%
  474.   \gdef\curr@landfloat{#1}%
  475.   \gdef\float@rotation{#2}%
  476.   \begin{#1}[p]%
  477.     \setbox\@tempboxa\vbox\bgroup
  478.       \hsize\@colht
  479.       \@parboxrestore}
  480. \def\endlandfloat{%
  481.       \par\vskip\z@
  482.     \egroup
  483.     \setbox\@tempboxa\hbox{\float@rotation{\box\@tempboxa}}%
  484.     \centerline{\box\@tempboxa}%
  485.   \expandafter\end\expandafter{\curr@landfloat}}
  486. % \boxput
  487. \def\boxput{\@ifstar{\@testtrue\@boxput}{\@testfalse\@boxput}}
  488. \def\@boxput{\@ifnextchar({\@@boxput}{\@@boxput(0,0)}}
  489. \long\def\@@boxput(#1,#2)#3#4{%
  490.   \setbox\@fancybox\hbox{{#4}}%
  491.   \setbox\@tempboxa\vbox to\z@{\vss\hbox to\z@{\hss{#3}\hss}\vss}%
  492.   \@tempdima=#1\wd\@fancybox
  493.   \advance\@tempdima\wd\@fancybox
  494.   \divide\@tempdima 2
  495.   \ifcat a#2\relax
  496.     \@tempdimb=\z@
  497.   \else
  498.     \@tempdimb=.5\ht\@fancybox
  499.     \advance\@tempdimb.5\dp\@fancybox
  500.     \@tempdimc=\@tempdimb
  501.     \advance\@tempdimc-\dp\@fancybox
  502.     \@tempdimb=#2\@tempdimb
  503.     \advance\@tempdimb\@tempdimc
  504.   \fi
  505.   \setbox\@tempboxa\hbox to \z@{%
  506.     \if@test\kern-\wd\@fancybox\fi
  507.     \kern\@tempdima\raise\@tempdimb\box\@tempboxa\hss}%
  508.   \ht\@tempboxa=\z@ \dp\@tempboxa=\z@
  509.   \leavevmode
  510.   \if@test
  511.     \hbox{\box\@fancybox\box\@tempboxa}%
  512.   \else
  513.     \hbox{\box\@tempboxa\box\@fancybox}%
  514.   \fi}
  515. % \Vfootnotes
  516. \def\VerbatimFootnotes{\let\@footnotetext\V@footnotetext}
  517. \long\def\V@footnotetext{%
  518.   \afterassignment\V@@footnotetext
  519.   \let\@tempa}
  520. \def\V@@footnotetext{%
  521.   \insert\footins\bgroup
  522.   \csname reset@font\endcsname
  523.   \footnotesize
  524.   \interlinepenalty\interfootnotelinepenalty
  525.   \splittopskip\footnotesep
  526.   \splitmaxdepth\dp\strutbox
  527.   \floatingpenalty \@MM
  528.   \hsize\columnwidth
  529.   \@parboxrestore
  530.   \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}%
  531.   \@makefntext{}%
  532.   \rule{\z@}{\footnotesep}%
  533.   \bgroup
  534.   \aftergroup\V@@@footnotetext
  535.   \ignorespaces}
  536. \def\V@@@footnotetext{\strut\egroup}
  537. % Verbatim
  538. % The main idea is to separate the reading and formatting of the
  539. % verbatim listing. It's pretty simple.
  540. \def\Verbatim@Codes{%
  541.   \let\do\@makeother
  542.   \dospecials
  543.   \Verbatim@ObeyThings
  544.   \ThisVerbCodes\relax\gdef\ThisVerbCodes{}}
  545. \def\EveryVerbatimCodes{}
  546. % \Verbatim is redefined temporarilly in \Get@Verbatim to scan the
  547. % verbatim text. \Verbatim is used so that error messages are more
  548. % enlightening. \next checks whether \Verbatim found its argument,
  549. % and attempts to recover if not.
  550. % Heuristically, if current environment is `foo' and argument of
  551. % \Get@Verbatim is \The@Verbatim, then definition of \Verbatim is
  552. % \def\Verbatim#1^^M#2^^M\the\EndVerbatimTokens\end{foo}{%
  553. %  \xdef\The@Verbatim{\noexpand\Every@VerbatimLine#2}%
  554. %  \endgroup\end{foo}}
  555. % \The@Verbatim is then equal to the verbatim text, with spaces
  556. % replaced by \Verbatim@Space, tabs replaced by \Verbatim@Tab,
  557. % and ` replaced by \@lquote. In addition, each line begins with
  558. % \Every@VerbatimLine, and each line but the last ends with
  559. % \Verbatim@Par. It is then possible to redefine these when formatting
  560. % the verbatim text. To insert each line as an argument to \foo, use
  561. %   \def\Every@VerbatimLine#1\Verbatim@Par{\foo{#1}}
  562. %   \The@Verbatim\Verbatim@Par
  563. \newtoks\EndVerbatimTokens
  564. \begingroup
  565.   \catcode`\|=0
  566.   \catcode`\[=1
  567.   \catcode`\]=2
  568.   \catcode`\{=12
  569.   \catcode`\}=12
  570.   \catcode`\^^M=13%
  571.   \catcode`\\=12%
  572.   |gdef|Get@Verbatim#1[%
  573.     |begingroup%
  574.       |Verbatim@Codes|EveryVerbatimCodes%
  575.       |let|protect|noexpand%
  576.       |VerbatimEnvironment%
  577.       |edef|next[|noexpand|def|noexpand|Verbatim####1|noexpand^^M####2%
  578.         |noexpand^^M|the|EndVerbatimTokens\end{|@VerbEnvir}]%
  579.       |edef|endVerbatim[|noexpand|endgroup|noexpand|end[|@VerbEnvir]]%
  580.       |global|let|@VerbEnvir|relax%
  581.       |next[|@nil|xdef#1[|noexpand|Every@VerbatimLine##2]|endVerbatim]%
  582.       |def|next[|@ifnextchar|@nil[|@gobble]%     If \@nil is there, then
  583.         [|gdef#1[]|endVerbatim|end[document]]]%  \Verbatim found its argument.
  584.       |expandafter|next|Verbatim]%               Otherwise, try to recover.
  585.   |gdef|AltGet@Verbatim#1[%
  586.     |begingroup%
  587.       |Verbatim@Codes|EveryVerbatimCodes%
  588.       |def^^M##1^^M##2[%
  589.         |ifx|@nil##2|@empty|else%
  590.           |noexpand|Verbatim@Par|noexpand|Every@VerbatimLine##1%
  591.           |expandafter^^M|expandafter##2%
  592.         |fi]%
  593.       |let|protect|noexpand%
  594.       |VerbatimEnvironment%
  595.       |edef|next[|noexpand|def|noexpand|Verbatim####1|noexpand^^M####2%
  596.         \end{|@VerbEnvir}]%
  597.       |edef|endVerbatim[|noexpand|endgroup|noexpand|end[|@VerbEnvir]]%
  598.       |global|let|@VerbEnvir|relax%
  599.       |next[|@nil|xdef#1[|noexpand|Every@VerbatimLine##2^^M|@nil]|endVerbatim]%
  600.       |def|next[|@ifnextchar|@nil[|@gobble]%
  601.         [|gdef#1[]|endVerbatim|end[document]]]%
  602.       |expandafter|next|Verbatim]%
  603. |endgroup
  604. \def\AltGetVerbatim{\let\Get@Verbatim\AltGet@Verbatim}
  605. % It is enough to not use \begin or \end when defining new verbatim
  606. % environments, as the default is for \Get@Verbatim to look for the
  607. % end of the current environment, but using \VerbatimEnvironment
  608. % is easier to explain to users.
  609. \def\VerbatimEnvironment{%
  610.   \ifx\@VerbEnvir\relax\xdef\@VerbEnvir{\@currenvir}\fi}
  611. \let\@VerbEnvir\relax
  612. \def\The@VerbatimErr{%
  613.   \gdef\The@Verbatim{\@latexerr{Misplaced \string\end{Verbatim}}\@ehd}}
  614. \The@VerbatimErr
  615. \begingroup
  616. \catcode`\^^M=\active%
  617. \catcode`\ =\active%
  618. \catcode`\^^I=\active%
  619. \gdef\Verbatim@ObeyThings{%
  620. \catcode`\^^M=\active%
  621. \catcode`\ =\active%
  622. \catcode`\^^I=\active%
  623. \catcode``=\active%
  624. \def^^M{\noexpand\Verbatim@Par\noexpand\Every@VerbatimLine}%
  625. \def^^I{\noexpand\Verbatim@Tab}%
  626. \def {\noexpand\Verbatim@Space}%
  627. \Verbatim@NoLigs}%
  628. \gdef\Verbatim@DontObeyLines{\outer\def^^M{}}%
  629. \endgroup
  630. \def\SaveVerbatim{\@bsphack\Get@Verbatim}
  631. \def\endSaveVerbatim{\@esphack}
  632. {\catcode``13 \gdef\Verbatim@NoLigs{\def`{\noexpand\@lquote}}}
  633. \def\Verbatim@Prep{%
  634.   \frenchspacing
  635.   \ThisVerb\relax\gdef\ThisVerb{}%
  636.   \VerbatimFont
  637.   \EveryVerbatim
  638.   \let\Every@VerbatimLine\EveryVerbatimLine
  639.   \def\Verbatim@Space{\leavevmode\penalty\@M\VerbatimSpace}%
  640.   \def\Verbatim@Tab{\leavevmode\penalty\@M\VerbatimTab}}%
  641. \def\Verb@Prep{%
  642.   \frenchspacing
  643.   \ThisVerb\relax\gdef\ThisVerb{}%
  644.   \VerbFont
  645.   \EveryVerb
  646.   \let\Every@VerbatimLine\EveryVerbatimLine
  647.   \def\Verbatim@Space{\leavevmode\penalty\@M\VerbSpace}%
  648.   \def\Verbatim@Tab{\leavevmode\penalty\@M\VerbTab}}%
  649. \def\Verbatim@Par{\leavevmode\null\@@par\penalty\interlinepenalty}
  650. % Parameter initialization:
  651. \def\VerbatimSpace{\ }
  652. {\catcode`\ =12\gdef\ttspace{{\tt }}}
  653. \def\VerbSpace{\ }
  654. \def\VerbatimTab{\ \ \ \ \ \ \ \ }
  655. \def\VerbTab{\ }
  656. \def\EveryVerbatim{}
  657. \def\EveryVerb{}
  658. \def\ThisVerb{}
  659. \def\EveryVerbatimLine{}%
  660. \def\EveryVerbOutLine{}
  661. \def\VerbatimFont{\tt}
  662. \def\VerbFont{\tt}
  663. \def\VerbatimFuzz{2pt}%
  664. \def\EveryVerbatimCodes{}
  665. \def\EveryVerbCodes{}
  666. \def\EveryVerbOutCodes{}
  667. \def\ThisVerbCodes{}
  668. \def\Verbatim@List#1{%
  669.   \if@minipage\else\vskip\parskip\fi
  670.   \leftskip\@totalleftmargin
  671.   \@rightskip\@flushglue \rightskip\@rightskip
  672.   \parindent\z@
  673.   \parskip\z@
  674.   \parfillskip\@flushglue
  675.   \hfuzz\VerbatimFuzz\relax
  676.   \@@par
  677.   \global\@inlabelfalse  %Prevents vspace from being inserted when
  678.   \Verbatim@Prep         %first line exceeds \hsize.
  679.   #1%
  680.   \Verbatim@Par}%
  681. \def\UseVerbatim#1{%
  682.   \begingroup\trivlist\item[]\Verbatim@List{#1}\endtrivlist\endgroup}
  683. \def\Verbatim{\Get@Verbatim\The@Verbatim}
  684. \def\endVerbatim{\UseVerbatim\The@Verbatim\The@VerbatimErr}
  685. \def\LUseVerbatim#1{%
  686.   \begingroup\list{}{}\item[]\Verbatim@List{#1}\endlist\endgroup}
  687. \def\LVerbatim{\Get@Verbatim\The@Verbatim}
  688. \def\endLVerbatim{\LUseVerbatim\The@Verbatim\The@VerbatimErr}
  689. \def\BUseVerbatim{%
  690.   \@ifnextchar[{\@BUseVerbatim}{\@BUseVerbatim[]}}
  691. \def\@BUseVerbatim[#1]#2{%
  692.   \begingroup
  693.     \Verbatim@Prep
  694.     \let\Verbatim@Par\@Btrivlistcr
  695.     \@Btrivlist{l}[#1]%
  696.     #2%
  697.     \endBtrivlist
  698.   \endgroup}%
  699. \def\BVerbatim{%
  700.   \catcode`\^^M=13\relax
  701.   \@ifnextchar[{\@BVerbatim}{\@BVerbatim[]}}
  702. \def\@BVerbatim[#1]{\def\@tempa{[#1]}\Get@Verbatim\The@Verbatim}
  703. \def\endBVerbatim{
  704.   \expandafter\@BUseVerbatim\@tempa\The@Verbatim\The@VerbatimErr}
  705. \newwrite\Verbatim@Outfile
  706. \def\VerbatimOut#1{%
  707.   \@bsphack
  708.   \begingroup
  709.     \immediate\openout\Verbatim@Outfile #1\relax
  710.     \def\EveryVerbatimCodes{\EveryVerbOutCodes}%
  711.     \Get@Verbatim\The@Verbatim}
  712. \def\endVerbatimOut{%
  713.     \Verbatim@ObeyThings
  714.     \def\Verbatim@Par{^^J}%
  715.     \def\Verbatim@Space{\space}%
  716.     \def\Verbatim@Tab{\space}%
  717.     \def\@lquote{\string`}%
  718.     \ThisVerb\relax\gdef\ThisVerb{}%
  719.     \let\Every@VerbatimLine\EveryVerbOutLine
  720.     \immediate\write\Verbatim@Outfile{\The@Verbatim}%
  721.     \immediate\closeout\Verbatim@Outfile
  722.   \endgroup
  723.   \The@VerbatimErr
  724.   \@esphack}
  725. % This one is a little tricky because:
  726. % * we want to ignore the ^^M at the end of the last line,
  727. % * we want to handle files that end with newline and files that don't
  728. % * we want comment characters to work properly,
  729. % * we want to expand each line before inserting \Every@VerbatimLine and
  730. %     \Verbatim@Par,
  731. % \The@GVerbatim is used as scratch with global redefinition.
  732. \newread\Verbatim@Infile
  733. \def\Verbatim@Input#1#2{%
  734.   \begingroup
  735.     \Verbatim@Codes\EveryVerbatimCodes
  736.     \immediate\openin\Verbatim@Infile #1\relax
  737.     \ifeof\Verbatim@Infile
  738.       \@latexerr{No verbatim file #1}\@ehd
  739.     \else
  740.       \def\The@GVerbatim{}\Verbatim@NextLine
  741.       \ifeof\Verbatim@Infile
  742.         \@latexerr{Verbatim file #1 is empty}\@ehd
  743.       \else
  744.         \let\The@Verbatim\The@GVerbatim
  745.         \def\The@GVerbatim{}\Verbatim@NextLine
  746.         #2{\Verbatim@@Input}%
  747.       \fi
  748.     \fi
  749.     \immediate\closein\Verbatim@Infile
  750.  \endgroup}
  751. \def\Verbatim@@Input{%
  752.   \let\protect\noexpand
  753.   \edef\The@Verbatim{%
  754.     \noexpand\Every@VerbatimLine
  755.     \The@Verbatim
  756.     \ifeof\Verbatim@Infile\else\noexpand\Verbatim@Par\fi}%
  757.   \let\protect\relax
  758.   \The@Verbatim
  759.   \ifeof\Verbatim@Infile\else
  760.     \let\The@Verbatim\The@GVerbatim
  761.     \def\The@GVerbatim{}\Verbatim@NextLine
  762.     \expandafter\Verbatim@@Input
  763.   \fi}%
  764. \begingroup\catcode`\^^M=\active%
  765. \gdef\Verbatim@NextLine{%
  766.   \ifeof\Verbatim@Infile\else%
  767.     \immediate\read\Verbatim@Infile to\@tempa%
  768.     \expandafter\Verbatim@@NextLine\@tempa^^M\relax^^M\@nil%
  769.   \fi}%
  770. % #2 is empty if line ends in ^^M, #2=\relax otherwise.
  771. \gdef\Verbatim@@NextLine#1^^M#2^^M#3\@nil{%
  772.   \expandafter\gdef\expandafter\The@GVerbatim\expandafter{\The@GVerbatim#1}%
  773.   \ifx#2\@empty\@empty\else\expandafter\Verbatim@NextLine\fi}%
  774. \endgroup%
  775. \def\UseVerb#1{\begingroup\Verb@Prep#1\endgroup}
  776. \def\SaveVerb{\@ifnextchar[{\Save@Verb}{\Save@Verb[]}}
  777. \long\def\Save@Verb[#1]#2{%
  778.   \begingroup
  779.     \Verbatim@Codes\Verbatim@DontObeyLines\EveryVerbCodes
  780.     \Save@@Verb{#1}{#2}}
  781. \long\def\Save@@Verb#1#2#3{%
  782.   \let\protect\noexpand
  783.   \def\next{\@ifnextchar\@nil{\@gobble}{\endgroup}}%
  784.   \long\def\Verb##1#3{\@nil\xdef#2{##1}\endgroup#1}%
  785.   \expandafter\next\Verb}
  786. \def\Verb{\Save@Verb[\UseVerb{\The@Verbatim}]{\The@Verbatim}}
  787. \def\VerbatimInput#1{\begingroup\Verbatim@Input{#1}\UseVerbatim\endgroup}
  788. \def\LVerbatimInput#1{\begingroup\Verbatim@Input{#1}\LUseVerbatim\endgroup}
  789. \def\BVerbatimInput{\@ifnextchar[{\@BVerbatimInput}{\@BVerbatimInput[]}}
  790. \def\@BVerbatimInput[#1]#2{%
  791.   \begingroup\Verbatim@Input{#2}{\@BUseVerbatim[#1]}\endgroup}
  792. \endinput
  793. %% END fancybox.sty
  794.